#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "Encoder.h"
#include "Serial.h"

volatile uint32_t g_SysTick = 0; // SysTick计数变量
#define MINI_PICE 80			 // 最小时间片，单位us

int16_t freq = 1000; // 频率
int16_t puls = 0;	 // 占空比
int16_t Term = 0;
uint16_t period = 0; // 计算得到的高电平时间
uint8_t k = 0;

int16_t count = 0;
int16_t last_count = 0;
uint32_t time = 0;
uint32_t last_time = 0;
uint32_t delta_time = 0;
uint32_t speed = 0; // 速度值
uint16_t last_speed = 0;
uint16_t temp = 0;

uint16_t loop_times = 0; // 主循环运行次数

void Show_AND_Delay_us(uint16_t num1, uint16_t num2, uint32_t delay_time) // 显示两个两位数 Delay时间等于delay_time * 100us
{

	if (delay_time % MINI_PICE >= MINI_PICE / 2)
		delay_time += MINI_PICE;
	else if (delay_time < MINI_PICE)
		delay_time = MINI_PICE;
	// 一次for循环为80us，至少循环次,循环两次以上才能在两个码段屏上都显示
	for (uint32_t i = 0; i < delay_time / MINI_PICE; i++)
	{
		if (i % 2 == 0)
			LED_Show(GPIOA, num1);
		else
			LED_Show(GPIOB, num2);
	}
}

int main(void)
{

	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 开启GPIOA的时钟

	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);			// 将PA0和PA1引脚初始化为推挽输出
	GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1); // 将PA0和PA1引脚初始化为低电平
	/*模块初始化*/
	Encoder_Init(freq); // 旋转编码器初始化

	LED_Init(); // LED初始化

	/*串口初始化*/
	// Serial_Init(); // 串口初始化

	while (1)
	{
		loop_times++;
		loop_times %= 1500;
		Encoder_Get(&freq, &puls, &count); //
		if (loop_times == 0)
		{
			speed = (count - last_count) * 2.5 * 10 * freq / 1500 / 2; // 计算速度值
			last_count = count;
			// temp = speed * 0.75 + last_speed * 0.25;
			// last_speed = speed;
			// speed = temp;
		}

		Term = 1000000 / freq; // us为单位
		period = puls * Term / 100;
		if (puls > 0)
		{
			GPIO_SetBits(GPIOA, GPIO_Pin_0);			   // PA0置高
			Show_AND_Delay_us(speed, freq, period);		   // 显示并延时
			GPIO_ResetBits(GPIOA, GPIO_Pin_0);			   // PA0置低
			Show_AND_Delay_us(speed, freq, Term - period); // 显示并延时
		}
		else
			Show_AND_Delay_us(speed, freq, 400); // 显示并延时
												 // Serial_Printf("Puls: %d\r\n", puls); // 通过串口打印当前的脉冲值

		// GPIO_ResetBits(GPIOA, GPIO_Pin_1); // PA1置低
		// Show_AND_Delay_us(Term, puls, 900);
		// GPIO_SetBits(GPIOA, GPIO_Pin_1); // PA1置高
		// Show_AND_Delay_us(Term, puls, 900);
	}
}
